package br.com.clubelivro.mb;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;

import br.com.clubelivro.bo.iface.IClubeLivroBO;
import br.com.clubelivro.modelo.CentroEspirita;
import br.com.clubelivro.modelo.Cidade;
import br.com.clubelivro.modelo.Endereco;
import br.com.clubelivro.modelo.Socio;
import br.com.clubelivro.modelo.UF;
import br.com.gaspar.framework.visao.jsf.ManagedBeanBase;
import br.com.gaspar.utils.ColecaoUtil;
import br.com.gaspar.utils.exception.BaseException;

@ManagedBean(name="SocioMB")
@ViewScoped
public class SocioMB extends ManagedBeanBase<Socio> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@EJB
	private IClubeLivroBO<Socio> bo;
	
	@ManagedProperty(value="#{UFMB}")
	private UFMB ufMB;
	
	@ManagedProperty(value="#{CidadeMB}")
	private CidadeMB cidadeMB;
	
	@ManagedProperty(value="#{CentroEspiritaMB}")
	private CentroEspiritaMB centroEspiritaMB;
	
	private List<UF> ufs;
	
	private UF uf;
	
	private List<Cidade> cidades;
	
	private List<Socio> socios;
	
	private List<CentroEspirita> centros;
	
	private Long numeroAtivos;

	private Long numeroInativos;
	
	
	//private StreamedContent relatorioPDF;
	
	@Override
	protected IClubeLivroBO<Socio> getFachada() {
		return bo;
	}
	
	@PostConstruct
	@Override
	public void iniciar() {
		entidade = new Socio();
		entidade.setEndereco(new Endereco());
		
		try {
			numeroAtivos = (Long) bo.buscarCount("Socio.buscarCount", true);
			numeroInativos = (Long) bo.buscarCount("Socio.buscarCount", false);
		} catch (BaseException e) {
			e.printStackTrace();
		}
		
		super.iniciar();
	}
	
	@Override
	protected void criarAntes() throws BaseException {
		entidade = new Socio();
		entidade.setEndereco(new Endereco());
		try {
			setUfs(ufMB.getFachada().buscarTodosPorNamedQuery("UF.buscarTodos"));
			setCidades(cidadeMB.getFachada().buscarTodosPorNamedQuery("Cidade.buscarPorUF", getUfs().get(0).getId()));
			setCentros(centroEspiritaMB.getFachada().buscarTodosPorNamedQuery("CentroEspirita.buscarTodos"));
		} catch (BaseException e) {
			e.printStackTrace();
		}
		super.criarAntes();
	}

	public UF getUf() {
		return uf;
	}

	public void setUf(UF uf) {
		this.uf = uf;
	}

	public List<Cidade> getCidades() {
		return cidades;
	}

	public void setCidades(List<Cidade> cidades) {
		this.cidades = cidades;
	}

	public void selecionarCidade(AjaxBehaviorEvent abe) throws BaseException{
		setCidades(cidadeMB.getFachada().buscarTodosPorNamedQuery("Cidade.buscarPorUF", uf.getId()));
	}
	
	@Override
	protected void editarAntes() throws BaseException {
		entidade = bo.buscarPorId(Socio.class, entidade.getId());
		setUfs(ufMB.getFachada().buscarTodosPorNamedQuery("UF.buscarTodos"));
		setCentros(centroEspiritaMB.getFachada().buscarTodosPorNamedQuery("CentroEspirita.buscarTodos"));
		setUf(getEntidade().getCidade().getUf());
		selecionarCidade(null);
	}
	
	public List<Socio> buscarPorNome(String nome) {  
        if(ColecaoUtil.ehNuloOuVazio(socios)){
        	try {
				socios = bo.buscarTodosPorNamedQuery("Socio.buscarAtivos");
			} catch (BaseException e) {
				e.printStackTrace();
			}
        }
        List<Socio> lista = new ArrayList<Socio>();  
          
        for(Socio p : socios) {  
            if(p.getNome().startsWith(nome))  
                lista.add(p);  
        }  
          
        return lista;  
    }
	
	@Override
	protected void listarAntes() throws BaseException {
		setNamedQueryLista("buscarTodosLista");
	}
	
	public void atualizarCentros() throws BaseException{
		centros = centroEspiritaMB.getFachada().buscarTodosPorNamedQuery("CentroEspirita.buscarTodos");
	}

	public List<Socio> getSocios() {
		return socios;
	}

	public void setSocios(List<Socio> socios) {
		this.socios = socios;
	}

	public List<UF> getUfs() {
		return ufs;
	}

	public void setUfs(List<UF> ufs) {
		this.ufs = ufs;
	}

	public UFMB getUfMB() {
		return ufMB;
	}

	public void setUfMB(UFMB ufMB) {
		this.ufMB = ufMB;
	}

	public CidadeMB getCidadeMB() {
		return cidadeMB;
	}

	public void setCidadeMB(CidadeMB cidadeMB) {
		this.cidadeMB = cidadeMB;
	}

	public List<CentroEspirita> getCentros() {
		return centros;
	}

	public void setCentros(List<CentroEspirita> centros) {
		this.centros = centros;
	}

	public CentroEspiritaMB getCentroEspiritaMB() {
		return centroEspiritaMB;
	}

	public void setCentroEspiritaMB(CentroEspiritaMB centroEspiritaMB) {
		this.centroEspiritaMB = centroEspiritaMB;
	}

	public Long getNumeroAtivos() {
		return numeroAtivos;
	}

	public void setNumeroAtivos(Long numeroAtivos) {
		this.numeroAtivos = numeroAtivos;
	}

	public Long getNumeroInativos() {
		return numeroInativos;
	}

	public void setNumeroInativos(Long numeroInativos) {
		this.numeroInativos = numeroInativos;
	}
	
	/*public StreamedContent getRelatorioPDF(){
		InputStream relatorio = null;
		try {
			List<Socio> lista = null;
			
			try {
				lista = bo.buscarTodosPorNamedQuery("Socio.buscarTodos");
			} catch (BaseException e) {
				e.printStackTrace();
			}
			
			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
		     ByteArrayOutputStream Teste = new ByteArrayOutputStream();
		     JasperReport jasperReport = (JasperReport)JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("relatorios/listagemSocio.jasper"));
		     jasperReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);

		     HashMap<String, Object> params = new HashMap<String, Object>();
		     JasperPrint print = JasperFillManager.fillReport(jasperReport, params, ds);

		     JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
		     //JRExporter exporter = new net.sf.jasperreports.engine.export.JRHtmlExporter();
		     //JRExporter exporter = new net.sf.jasperreports.engine.export.JRXlsExporter();
		     //JRExporter exporter = new net.sf.jasperreports.engine.export.JRXmlExporter();
		     //JRExporter exporter = new net.sf.jasperreports.engine.export.JRCsvExporter();

		     //exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, pdfFile);
		     exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, Teste);
		     exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
		     exporter.exportReport();

		     relatorio = new ByteArrayInputStream(Teste.toByteArray());

		 } catch (JRException ex) {
			 System.out.println(ex);
		 }
		 this.relatorioPDF = new DefaultStreamedContent(relatorio, "", "listaSocio.pdf");
		 return this.relatorioPDF;
		}

	public void setRelatorioPDF(StreamedContent relatorioPDF) {
		this.relatorioPDF = relatorioPDF;
	}*/
	
	/*@Override
	protected void gravarAntes() throws BaseException {
		getEntidade().setCidade(cidadeBO.buscarPorId(Cidade.class, 2L));
	}*/
	
}
